
; 初始化 Descriptor
; 参数1： address of segment
; 参数2:  address of descriptor
%macro	InitDescriptor	2
	xor	eax, eax
	mov	ax, cs
	shl	eax, 4
	add	eax, %1
	mov	word [%2 + 2], ax
	shr	eax, 16
	mov	byte [%2 + 4], al
	mov	byte [%2 + 7], ah
%endmacro

; 加载 gdt
; 首先将 gdt[%s] 的地址放入到地址[%2] 当中
; 而后加载
%macro	LoadGdt	2
	push 	eax
	xor	eax, eax
	mov	ax, ds
	shl	eax, 4
	add	eax, %1
	mov	dword[%2 + 2], eax

	lgdt	[GdtPtr]
	pop	eax
%endmacro

; 开启保护模式
%macro	EnterPMModel	0
	push	eax
	cli
	in	al, 92h
	or	al, 000000010b
	out	92h, al

	mov	eax, cr0
	or	eax, 0x1
	mov	cr0, eax
	pop	eax
%endmacro